submission 31540
KernelBot user 292 · 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.
hipmode.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-31540?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz
Benchmark evidence
18 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
81.0µs
#27 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
81.6µs
#27 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
152.9µs
#38 of 98
2025-06-06
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
165.7µs
#26 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
178.3µs
#30 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
204.0µs
#32 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
355.6µs
#34 of 98
2025-06-06
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
977.9µs
#36 of 98
2025-06-06
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:179e87f6fd1b1f70de3fedf5cde6888be52dd64ff29f209b3a0e9566f97a4ce5
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
hipmode.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAgICANCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgIA0KDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047IA0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOyAgDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICB0aWxlQlt0NjR4XVsxMTIgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDExMiArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIHRpbGVCW3Q2NHggKyA2NF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07DQoNCiAgICAgICAgZmxvYXQgdGlsZUFzID0gQXNfcHRyWyhrYmFzZSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgMQ0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTEVGVCBPVkVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gbGVmdCBvdmVyIDMyIHJvd3MNCiAgDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyAxMTIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KDQogICAgICAgIC8vIGF1dG8gdHJhbnNwb3NlZF9mcmFnID0gcm9jd21tYTo6YXBwbHlUcmFuc3Bvc2UoZnJhZ19iX2xlZnQpOyAgICAgDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyAxMTIsIGxkYik7ICAgICAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iX2xlZnQsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIH0vLyBlbmQgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IDEyOCkgDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTSkgcmV0dXJuOyAgICANCiAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCg0KfQ0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDMyDQojZGVmaW5lIFdNTUFfTiAzMg0KI2RlZmluZSBXTU1BX0sgMTYNCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQojZGVmaW5lIE9QVElPTiAwDQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBiYWxhbmNlX29sZF9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgMTguNSBLRCBvZiBMRFMNCiAgICAqLw0KICAgIA0KICAgIA0KICAgIA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs0XVs0XVs1MTJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbNF1bNF1bNTEyXTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFuc3Bvc2VkDQogICAgLy8gX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBpbnQgbGRhID0gNTEyOw0KICAgIGludCBsZGIgPSA1MTI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQoNCiAgICBpbnQgY29sXzUxMl9pZHggPSAodDY0eSAvIDgpICogMjU2ICsgKHQ2NHggJSAzMikgKiA4ICsgdDY0eSAlIDg7DQogICAgaW50IE1OX2xvYWRfaWR4ID0gdDY0eCAlIDMyICsgMzIgKiAodDY0eCAvIDMyKTsgICAgDQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIGludCBLX2xvYWRfaWR4ID0ga2Jhc2UgKyB0NjR5ICUgOCArIDggKiAodDY0eSAvIDgpOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrYmxvY2tpZHggPSAwOyBrYmxvY2tpZHggPCA0OyArK2tibG9ja2lkeCkgew0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7IC8vIHRvcCBhbmQgYm90dG9tDQogICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGkgKiA2NDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aWxlQVtpICogMiArIHQ2NHggLyAzMl1ba2Jsb2NraWR4XVtjb2xfNTEyX2lkeF0gPSANCiAgICAgICAgICAgICAgICAgICAgQV9wdHJbb2Zmc2V0ICsgYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyBNTl9sb2FkX2lkeCArIE0gKiAoS19sb2FkX2lkeCArIGtibG9ja2lkeCAqIDE2KV07DQogICAgICAgIA0KICAgICAgICAgICAgICAgIHRpbGVCW2kgKiAyICsgdDY0eCAvIDMyXVtrYmxvY2tpZHhdW2NvbF81MTJfaWR4XSA9IA0KICAgICAgICAgICAgICAgICAgICBCX3B0cltvZmZzZXQgKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIE1OX2xvYWRfaWR4ICsgTiAqIChLX2xvYWRfaWR4ICsga2Jsb2NraWR4ICogMTYpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQoNCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIGZsb2F0MiB2YWwgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdOw0KICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdDIqPih0aWxlQXMpW3Q2NHhdID0gbWFrZV9mbG9hdDIodmFsLnggKiB0aWxlQnMsIHZhbC55ICogdGlsZUJzKTsNCiAgICAgICAgfSAgICAgICANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICAvLyBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICAvLyBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDINCiAgICAgICAgZm9yIChpbnQga2Jsb2NraWR4ID0gMDsga2Jsb2NraWR4IDwgNDsgKytrYmxvY2tpZHgpIHsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQVt3YXJwX2lkeF95XVtrYmxvY2tpZHhdW3Q2NHggKiA4XSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQlt3YXJwX2lkeF94XVtrYmxvY2tpZHhdW3Q2NHggKiA4XSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGtibG9ja2lkeCA9IDA7IGtibG9ja2lkeCA8IDQ7ICsra2Jsb2NraWR4KSB7DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsNCiAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaSAqIDY0Ow0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRpbGVBW2kgKiAyICsgdDY0eCAvIDMyXVtrYmxvY2tpZHhdW2NvbF81MTJfaWR4XSA9IA0KICAgICAgICAgICAgICAgICAgICBBX3B0cltvZmZzZXQgKyBibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIE1OX2xvYWRfaWR4ICsgTSAqICg2NCArIEtfbG9hZF9pZHggKyBrYmxvY2tpZHggKiAxNildOw0KICAgICAgICANCiAgICAgICAgICAgICAgICB0aWxlQltpICogMiArIHQ2NHggLyAzMl1ba2Jsb2NraWR4XVtjb2xfNTEyX2lkeF0gPSANCiAgICAgICAgICAgICAgICAgICAgQl9wdHJbb2Zmc2V0ICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyBNTl9sb2FkX2lkeCArIE4gKiAoNjQgKyBLX2xvYWRfaWR4ICsga2Jsb2NraWR4ICogMTYpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrYmxvY2tpZHggPSAwOyBrYmxvY2tpZHggPCA0OyArK2tibG9ja2lkeCkgew0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVBW3dhcnBfaWR4X3ldW2tibG9ja2lkeF1bdDY0eCAqIDhdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVCW3dhcnBfaWR4X3hdW2tibG9ja2lkeF1bdDY0eCAqIDhdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgLy8gcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGtibG9ja2lkeCAqIFdNTUFfSyArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSl7DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opew0KICAgICAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2kgKiA0ICsgal0gKz0gdGlsZUFzW3dhcnBfaWR4X3kgKiBXTU1BX00gKyA0ICogKHQ2NHggLyAzMikgKyA4ICogaSArIGpdICogZnJhZ19hY2NfYmxvY2sueFtpICogNCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ICANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIC8vaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsgIA0KDQogICAgLy9pbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIC8vaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzI1Nl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsyNTZdOyAvLyByb3ctbWFqDQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICAgICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCg0KICAgICAgICBpbnQgdDY0eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDY0Ow0KICAgICAgICBpbnQgdDY0eSA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAvIDY0Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDQNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1bS19pZHhfc2hpZnR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsgICANCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdWzEyOCArIEtfaWR4X3NoaWZ0eV0gPSBCX3B0clsoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0gICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW0tfaWR4X3NoaWZ0eV0gPSBBX3B0cltibG9ja0lkeC54ICogV01NQV9NICogTlVNX1dBUlBfWCArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07ICAgICAgIA0KICAgICAgIA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1bMTI4ICsgS19pZHhfc2hpZnR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIA0KICAgICAgICB9IA0KDQogICAgICAgIGZsb2F0IHRpbGVBczEgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCczEgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMSA9IHRpbGVBczEgKiB0aWxlQnMxOw0KICAgICAgICBmbG9hdCB0aWxlQXMyID0gQXNfcHRyWygxICsga2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzMiA9IEJzX3B0clsoMSArIGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMiA9IHRpbGVBczIgKiB0aWxlQnMyOw0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgDQogICAgICAgIC8vIF9fdGhyZWFkZmVuY2VfYmxvY2soKTsNCiAgICAgICAgLy8gTUZNQQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgMTI4OyBrbWluaSArPSBXTU1BX0spew0KICAgICAgICAgICAgaW50IHRpbGVCX3JvdyA9IHdhcnBfaWR4X3kgKiBXTU1BX00gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICBpbnQgS19pZHhfYmFzZSA9IGttaW5pICsgKHQ2NHggLyAxNikgKiA4Ow0KICAgICAgICAgICAgaW50IEtfaWR4X3NoaWZ0eUIgPSAoS19pZHhfYmFzZSArIDggKiB0aWxlQl9yb3cpICUgMTI4Ow0KICAgICAgICAgICAgLy8gbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVCW3RpbGVCX3Jvd11bS19pZHhfc2hpZnR5Ql0sIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbMF1bMF0gKyB0aWxlQl9yb3cgKiAyNTYgKyBLX2lkeF9zaGlmdHlCLCBzaXplb2YobG9uZykpOyANCg0KICAgICAgICAgICAgaW50IHRpbGVBX2NvbCA9IHdhcnBfaWR4X3ggKiBXTU1BX04gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICAvLyBpbnQgS19pZHhfc2hpZnR5QSA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVBX2NvbCkgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYi54WzBdLCAmdGlsZUFbdGlsZUFfY29sXVtLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVswXVswXSArIHRpbGVBX2NvbCAqIDI1NiArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTEsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrMiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2syLCAwLmYpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSyl7DQogICAgICAgICAgICBpbnQgdGlsZUJfcm93ID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIGludCBLX2lkeF9iYXNlID0ga21pbmkgKyAodDY0eCAvIDE2KSAqIDg7DQogICAgICAgICAgICBpbnQgS19pZHhfc2hpZnR5QiA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVCX3JvdykgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbdGlsZUJfcm93XVsxMjggKyBLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQlswXVswXSArIHRpbGVCX3JvdyAqIDI1NiArIDEyOCArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7IA0KDQogICAgICAgICAgICBpbnQgdGlsZUFfY29sID0gd2FycF9pZHhfeCAqIFdNTUFfTiArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIC8vIGludCBLX2lkeF9zaGlmdHlBID0gKEtfaWR4X2Jhc2UgKyA4ICogdGlsZUFfY29sKSAlIDEyODsNCiAgICAgICAgICAgIC8vIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVt0aWxlQV9jb2xdWzEyOCArIEtfaWR4X3NoaWZ0eUJdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVBWzBdWzBdICsgdGlsZUFfY29sICogMjU2ICsgMTI4ICsgS19pZHhfc2hpZnR5Qiwgc2l6ZW9mKGxvbmcpKTsNCg0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2syLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2syKTsNCiAgICAgICAgfSANCg0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTIsIGZyYWdfYWNjX2Jsb2NrMi54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47IA0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0KY29uc3RleHByIGludCBLX1ZBTFVFID0gNzE2ODsNCmNvbnN0ZXhwciBpbnQgTV9WQUxVRSA9IDYxNDQ7DQpjb25zdGV4cHIgaW50IE5fVkFMVUUgPSA0NjA4Ow0KY29uc3RleHByIGludCBOX1ZBTFVFMiA9IDE1MzY7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgKE4gPT0gTl9WQUxVRSB8fCBOID09IE5fVkFMVUUyKSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IFRIUkVTSE9MRCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 27143.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAgICANCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgIA0KDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047IA0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOyAgDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICB0aWxlQlt0NjR4XVsxMTIgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDExMiArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIHRpbGVCW3Q2NHggKyA2NF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07DQoNCiAgICAgICAgZmxvYXQgdGlsZUFzID0gQXNfcHRyWyhrYmFzZSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgMQ0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTEVGVCBPVkVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gbGVmdCBvdmVyIDMyIHJvd3MNCiAgDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyAxMTIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KDQogICAgICAgIC8vIGF1dG8gdHJhbnNwb3NlZF9mcmFnID0gcm9jd21tYTo6YXBwbHlUcmFuc3Bvc2UoZnJhZ19iX2xlZnQpOyAgICAgDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyAxMTIsIGxkYik7ICAgICAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iX2xlZnQsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIH0vLyBlbmQgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IDEyOCkgDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTSkgcmV0dXJuOyAgICANCiAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCg0KfQ0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDMyDQojZGVmaW5lIFdNTUFfTiAzMg0KI2RlZmluZSBXTU1BX0sgMTYNCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQojZGVmaW5lIE9QVElPTiAwDQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBiYWxhbmNlX29sZF9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgMTguNSBLRCBvZiBMRFMNCiAgICAqLw0KICAgIA0KICAgIA0KICAgIA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVsxMjhdWzcyXTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBpbnQgbGRhID0gNzI7DQogICAgaW50IGxkYiA9IDcyOw0KICAgIF9fc2hhcmVkX18gZmxvYXQgdGlsZUFzWzEyOF07DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQogICAgDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgICAvLyBUUlk6IHRlc3QgdGlsZWQgcGFydGl0aW9uIDY0ICAgDQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaV9sb2FkID0gMDsga21pbmlfbG9hZCA8IDY0OyBrbWluaV9sb2FkICs9IDE2KXsgIC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCiAgICAgICAgDQogICAgICAgIGludCB0MTI4eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDEyODsNCiAgICAgICAgaW50IHQxMjh5ID0gdGhpc190Yi50aHJlYWRfcmFuaygpIC8gMTI4OyANCg0KICAgICAgICBpZiAodDEyOHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIHRpbGVBc1t0MTI4eF0gPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0MTI4eCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHRpbGVCczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIC8vaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsgIA0KDQogICAgLy9pbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIC8vaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzI1Nl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsyNTZdOyAvLyByb3ctbWFqDQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICAgICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCg0KICAgICAgICBpbnQgdDY0eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDY0Ow0KICAgICAgICBpbnQgdDY0eSA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAvIDY0Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDQNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1bS19pZHhfc2hpZnR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsgICANCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdWzEyOCArIEtfaWR4X3NoaWZ0eV0gPSBCX3B0clsoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0gICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW0tfaWR4X3NoaWZ0eV0gPSBBX3B0cltibG9ja0lkeC54ICogV01NQV9NICogTlVNX1dBUlBfWCArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07ICAgICAgIA0KICAgICAgIA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1bMTI4ICsgS19pZHhfc2hpZnR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIA0KICAgICAgICB9IA0KDQogICAgICAgIGZsb2F0IHRpbGVBczEgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCczEgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMSA9IHRpbGVBczEgKiB0aWxlQnMxOw0KICAgICAgICBmbG9hdCB0aWxlQXMyID0gQXNfcHRyWygxICsga2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzMiA9IEJzX3B0clsoMSArIGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMiA9IHRpbGVBczIgKiB0aWxlQnMyOw0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgDQogICAgICAgIC8vIF9fdGhyZWFkZmVuY2VfYmxvY2soKTsNCiAgICAgICAgLy8gTUZNQQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgMTI4OyBrbWluaSArPSBXTU1BX0spew0KICAgICAgICAgICAgaW50IHRpbGVCX3JvdyA9IHdhcnBfaWR4X3kgKiBXTU1BX00gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICBpbnQgS19pZHhfYmFzZSA9IGttaW5pICsgKHQ2NHggLyAxNikgKiA4Ow0KICAgICAgICAgICAgaW50IEtfaWR4X3NoaWZ0eUIgPSAoS19pZHhfYmFzZSArIDggKiB0aWxlQl9yb3cpICUgMTI4Ow0KICAgICAgICAgICAgLy8gbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVCW3RpbGVCX3Jvd11bS19pZHhfc2hpZnR5Ql0sIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbMF1bMF0gKyB0aWxlQl9yb3cgKiAyNTYgKyBLX2lkeF9zaGlmdHlCLCBzaXplb2YobG9uZykpOyANCg0KICAgICAgICAgICAgaW50IHRpbGVBX2NvbCA9IHdhcnBfaWR4X3ggKiBXTU1BX04gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICAvLyBpbnQgS19pZHhfc2hpZnR5QSA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVBX2NvbCkgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYi54WzBdLCAmdGlsZUFbdGlsZUFfY29sXVtLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVswXVswXSArIHRpbGVBX2NvbCAqIDI1NiArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTEsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrMiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2syLCAwLmYpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSyl7DQogICAgICAgICAgICBpbnQgdGlsZUJfcm93ID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIGludCBLX2lkeF9iYXNlID0ga21pbmkgKyAodDY0eCAvIDE2KSAqIDg7DQogICAgICAgICAgICBpbnQgS19pZHhfc2hpZnR5QiA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVCX3JvdykgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbdGlsZUJfcm93XVsxMjggKyBLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQlswXVswXSArIHRpbGVCX3JvdyAqIDI1NiArIDEyOCArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7IA0KDQogICAgICAgICAgICBpbnQgdGlsZUFfY29sID0gd2FycF9pZHhfeCAqIFdNTUFfTiArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIC8vIGludCBLX2lkeF9zaGlmdHlBID0gKEtfaWR4X2Jhc2UgKyA4ICogdGlsZUFfY29sKSAlIDEyODsNCiAgICAgICAgICAgIC8vIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVt0aWxlQV9jb2xdWzEyOCArIEtfaWR4X3NoaWZ0eUJdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVBWzBdWzBdICsgdGlsZUFfY29sICogMjU2ICsgMTI4ICsgS19pZHhfc2hpZnR5Qiwgc2l6ZW9mKGxvbmcpKTsNCg0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2syLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2syKTsNCiAgICAgICAgfSANCg0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTIsIGZyYWdfYWNjX2Jsb2NrMi54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47IA0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0KY29uc3RleHByIGludCBLX1ZBTFVFID0gNzE2ODsNCmNvbnN0ZXhwciBpbnQgTV9WQUxVRSA9IDYxNDQ7DQpjb25zdGV4cHIgaW50IE5fVkFMVUUgPSA0NjA4Ow0KY29uc3RleHByIGludCBOX1ZBTFVFMiA9IDE1MzY7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgKE4gPT0gTl9WQUxVRSB8fCBOID09IE5fVkFMVUUyKSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IFRIUkVTSE9MRCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAgICANCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgIA0KDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047IA0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOyAgDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICB0aWxlQlt0NjR4XVsxMTIgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDExMiArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIHRpbGVCW3Q2NHggKyA2NF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07DQoNCiAgICAgICAgZmxvYXQgdGlsZUFzID0gQXNfcHRyWyhrYmFzZSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgMQ0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTEVGVCBPVkVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gbGVmdCBvdmVyIDMyIHJvd3MNCiAgDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyAxMTIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KDQogICAgICAgIC8vIGF1dG8gdHJhbnNwb3NlZF9mcmFnID0gcm9jd21tYTo6YXBwbHlUcmFuc3Bvc2UoZnJhZ19iX2xlZnQpOyAgICAgDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyAxMTIsIGxkYik7ICAgICAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iX2xlZnQsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIH0vLyBlbmQgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IDEyOCkgDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTSkgcmV0dXJuOyAgICANCiAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCg0KfQ0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDMyDQojZGVmaW5lIFdNTUFfTiAzMg0KI2RlZmluZSBXTU1BX0sgMTYNCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQojZGVmaW5lIE9QVElPTiAwDQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBiYWxhbmNlX29sZF9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgMTguNSBLRCBvZiBMRFMNCiAgICAqLw0KICAgIA0KICAgIA0KICAgIA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs0XVs0XVs1MTJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbNF1bNF1bNTEyXTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFuc3Bvc2VkDQogICAgLy8gX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBpbnQgbGRhID0gNTEyOw0KICAgIGludCBsZGIgPSA1MTI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQoNCiAgICBpbnQgY29sXzUxMl9pZHggPSAodDY0eSAvIDgpICogMjU2ICsgKHQ2NHggJSAzMikgKiA4ICsgdDY0eSAlIDg7DQogICAgaW50IE1OX2xvYWRfaWR4ID0gdDY0eCAlIDMyICsgMzIgKiAodDY0eCAvIDMyKTsgICAgDQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIGludCBLX2xvYWRfaWR4ID0ga2Jhc2UgKyB0NjR5ICUgOCArIDggKiAodDY0eSAvIDgpOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrYmxvY2tpZHggPSAwOyBrYmxvY2tpZHggPCA0OyArK2tibG9ja2lkeCkgew0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7IC8vIHRvcCBhbmQgYm90dG9tDQogICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGkgKiA2NDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aWxlQVtpICogMiArIHQ2NHggLyAzMl1ba2Jsb2NraWR4XVtjb2xfNTEyX2lkeF0gPSANCiAgICAgICAgICAgICAgICAgICAgQV9wdHJbb2Zmc2V0ICsgYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyBNTl9sb2FkX2lkeCArIE0gKiAoS19sb2FkX2lkeCArIGtibG9ja2lkeCAqIDE2KV07DQogICAgICAgIA0KICAgICAgICAgICAgICAgIHRpbGVCW2kgKiAyICsgdDY0eCAvIDMyXVtrYmxvY2tpZHhdW2NvbF81MTJfaWR4XSA9IA0KICAgICAgICAgICAgICAgICAgICBCX3B0cltvZmZzZXQgKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIE1OX2xvYWRfaWR4ICsgTiAqIChLX2xvYWRfaWR4ICsga2Jsb2NraWR4ICogMTYpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQoNCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIGZsb2F0MiB2YWwgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdOw0KICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdDIqPih0aWxlQXMpW3Q2NHhdID0gbWFrZV9mbG9hdDIodmFsLnggKiB0aWxlQnMsIHZhbC55ICogdGlsZUJzKTsNCiAgICAgICAgfSAgICAgICANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICAvLyBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICAvLyBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDINCiAgICAgICAgZm9yIChpbnQga2Jsb2NraWR4ID0gMDsga2Jsb2NraWR4IDwgNDsgKytrYmxvY2tpZHgpIHsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQVt3YXJwX2lkeF95XVtrYmxvY2tpZHhdW3Q2NHggKiA4XSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQlt3YXJwX2lkeF94XVtrYmxvY2tpZHhdW3Q2NHggKiA4XSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGtibG9ja2lkeCA9IDA7IGtibG9ja2lkeCA8IDQ7ICsra2Jsb2NraWR4KSB7DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsNCiAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaSAqIDY0Ow0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRpbGVBW2kgKiAyICsgdDY0eCAvIDMyXVtrYmxvY2tpZHhdW2NvbF81MTJfaWR4XSA9IA0KICAgICAgICAgICAgICAgICAgICBBX3B0cltvZmZzZXQgKyBibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIE1OX2xvYWRfaWR4ICsgTSAqICg2NCArIEtfbG9hZF9pZHggKyBrYmxvY2tpZHggKiAxNildOw0KICAgICAgICANCiAgICAgICAgICAgICAgICB0aWxlQltpICogMiArIHQ2NHggLyAzMl1ba2Jsb2NraWR4XVtjb2xfNTEyX2lkeF0gPSANCiAgICAgICAgICAgICAgICAgICAgQl9wdHJbb2Zmc2V0ICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyBNTl9sb2FkX2lkeCArIE4gKiAoNjQgKyBLX2xvYWRfaWR4ICsga2Jsb2NraWR4ICogMTYpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrYmxvY2tpZHggPSAwOyBrYmxvY2tpZHggPCA0OyArK2tibG9ja2lkeCkgew0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVBW3dhcnBfaWR4X3ldW2tibG9ja2lkeF1bdDY0eCAqIDhdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVCW3dhcnBfaWR4X3hdW2tibG9ja2lkeF1bdDY0eCAqIDhdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgLy8gcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGtibG9ja2lkeCAqIFdNTUFfSyArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSl7DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opew0KICAgICAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2kgKiA0ICsgal0gKz0gdGlsZUFzW3dhcnBfaWR4X3kgKiBXTU1BX00gKyA0ICogKHQ2NHggLyAzMikgKyA4ICogaSArIGpdICogZnJhZ19hY2NfYmxvY2sueFtpICogNCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ICANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIC8vaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsgIA0KDQogICAgLy9pbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIC8vaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzI1Nl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsyNTZdOyAvLyByb3ctbWFqDQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICAgICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCg0KICAgICAgICBpbnQgdDY0eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDY0Ow0KICAgICAgICBpbnQgdDY0eSA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAvIDY0Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDQNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1bS19pZHhfc2hpZnR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsgICANCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdWzEyOCArIEtfaWR4X3NoaWZ0eV0gPSBCX3B0clsoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0gICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW0tfaWR4X3NoaWZ0eV0gPSBBX3B0cltibG9ja0lkeC54ICogV01NQV9NICogTlVNX1dBUlBfWCArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07ICAgICAgIA0KICAgICAgIA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1bMTI4ICsgS19pZHhfc2hpZnR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIA0KICAgICAgICB9IA0KDQogICAgICAgIGZsb2F0IHRpbGVBczEgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCczEgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMSA9IHRpbGVBczEgKiB0aWxlQnMxOw0KICAgICAgICBmbG9hdCB0aWxlQXMyID0gQXNfcHRyWygxICsga2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzMiA9IEJzX3B0clsoMSArIGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMiA9IHRpbGVBczIgKiB0aWxlQnMyOw0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgDQogICAgICAgIC8vIF9fdGhyZWFkZmVuY2VfYmxvY2soKTsNCiAgICAgICAgLy8gTUZNQQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgMTI4OyBrbWluaSArPSBXTU1BX0spew0KICAgICAgICAgICAgaW50IHRpbGVCX3JvdyA9IHdhcnBfaWR4X3kgKiBXTU1BX00gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICBpbnQgS19pZHhfYmFzZSA9IGttaW5pICsgKHQ2NHggLyAxNikgKiA4Ow0KICAgICAgICAgICAgaW50IEtfaWR4X3NoaWZ0eUIgPSAoS19pZHhfYmFzZSArIDggKiB0aWxlQl9yb3cpICUgMTI4Ow0KICAgICAgICAgICAgLy8gbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVCW3RpbGVCX3Jvd11bS19pZHhfc2hpZnR5Ql0sIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbMF1bMF0gKyB0aWxlQl9yb3cgKiAyNTYgKyBLX2lkeF9zaGlmdHlCLCBzaXplb2YobG9uZykpOyANCg0KICAgICAgICAgICAgaW50IHRpbGVBX2NvbCA9IHdhcnBfaWR4X3ggKiBXTU1BX04gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICAvLyBpbnQgS19pZHhfc2hpZnR5QSA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVBX2NvbCkgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYi54WzBdLCAmdGlsZUFbdGlsZUFfY29sXVtLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVswXVswXSArIHRpbGVBX2NvbCAqIDI1NiArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTEsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrMiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2syLCAwLmYpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSyl7DQogICAgICAgICAgICBpbnQgdGlsZUJfcm93ID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIGludCBLX2lkeF9iYXNlID0ga21pbmkgKyAodDY0eCAvIDE2KSAqIDg7DQogICAgICAgICAgICBpbnQgS19pZHhfc2hpZnR5QiA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVCX3JvdykgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbdGlsZUJfcm93XVsxMjggKyBLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQlswXVswXSArIHRpbGVCX3JvdyAqIDI1NiArIDEyOCArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7IA0KDQogICAgICAgICAgICBpbnQgdGlsZUFfY29sID0gd2FycF9pZHhfeCAqIFdNTUFfTiArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIC8vIGludCBLX2lkeF9zaGlmdHlBID0gKEtfaWR4X2Jhc2UgKyA4ICogdGlsZUFfY29sKSAlIDEyODsNCiAgICAgICAgICAgIC8vIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVt0aWxlQV9jb2xdWzEyOCArIEtfaWR4X3NoaWZ0eUJdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVBWzBdWzBdICsgdGlsZUFfY29sICogMjU2ICsgMTI4ICsgS19pZHhfc2hpZnR5Qiwgc2l6ZW9mKGxvbmcpKTsNCg0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2syLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2syKTsNCiAgICAgICAgfSANCg0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTIsIGZyYWdfYWNjX2Jsb2NrMi54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47IA0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0KY29uc3RleHByIGludCBLX1ZBTFVFID0gNzE2ODsNCmNvbnN0ZXhwciBpbnQgTV9WQUxVRSA9IDYxNDQ7DQpjb25zdGV4cHIgaW50IE5fVkFMVUUgPSA0NjA4Ow0KY29uc3RleHByIGludCBOX1ZBTFVFMiA9IDE1MzY7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgKE4gPT0gTl9WQUxVRSB8fCBOID09IE5fVkFMVUUyKSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IFRIUkVTSE9MRCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=No newline at end of file
Best evidence level for this revision: reported
JSON