submission 24658
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-24658?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
87.9µs
#32 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
96.5µs
#38 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
157.1µs
#41 of 98
2025-05-19
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
169.4µs
#32 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
183.0µs
#34 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
209.2µs
#35 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
361.6µs
#37 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.03ms
#41 of 98
2025-05-19
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:1f62098b6b79c2ffd5cf5e78611b3a798b8e4b448e757cef0dcd505525b17b47
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
hipmode.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIGZsb2F0MiB2YWwgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdOw0KICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdDIqPih0aWxlQXMpW3Q2NHhdID0gbWFrZV9mbG9hdDIodmFsLnggKiB0aWxlQnMsIHZhbC55ICogdGlsZUJzKTsNCiAgICAgICAgfSAgICAgICANCg0KICAgICAgICAvLyBpZiAodDY0eSA9PSAwKSB7DQogICAgICAgIC8vICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKCgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgLy8gICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQyKj4oQXNfcHRyICsgYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyBNICogKGtiYXNlIC8gMTI4KSlbdDY0eF0gKiB0aWxlQnM7DQogICAgICAgIC8vIH0NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIC8vaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgLy9pbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIC8vaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIC8vaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAvL2ludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgLy9pZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOyAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBOICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9yb3dfbWFqb3IpOw0KfQ0KDQojZGVmaW5lIEtfSlVNUCAyNTYNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBrX2xhcmdlX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBQZXJmb3JtIEIgQCBBLlQgPSBDLlQsIHNvIHdlIGNhbiBzdG9yZSBzY2FsZSBBcyBpbiBhIFZHUFIgb2YgZWFjaCB0aHJlYWQgaW4gYSB3YXJwDQogICAgQjogTnhLIGNvbC1tYWogLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IE4vMTI4IHggSy8xMjggY29sLW1hag0KICAgIEEuVDogS3hNIHJvdy1tYWogLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBLLyAxMjggeCBNIHJvdy1tYWoNCiAgICBDLlQ6IE54TSBjb2wtbWFqDQogICAgTSwgTiBhcmUgZGl2aXNpYmxlIGJ5IDY0LCBLIGlzIGRpdmlzaWJsZSBieSAyNTYNCg0KICAgIFNNRU0gd2l0aCBwYWRkaW5nIHBlciBibG9jazoNCiAgICA2NCAqICgyNTYgKyA4KSAvIDEwMjQgKyA2NCAqICgyMjQgKyA4KSAvIDEwMjQgPSAxNi41ICsgMTQuNSA9IDMxIEtCIHBlciBibG9jaw0KDQogICAgKi8NCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgIC8vIGludCBzbiA9IE4gLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbNjRdWzI2NF07IC8vIHJvdy1tYWoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzIzMl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgaW50IGxkYiA9IDI2NDsNCiAgICBpbnQgbGRhID0gMjMyOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyBMb2FkIHRpbGVzDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDMyOyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHRpbGVCW3Q2NHhdWzIyNCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMjI0ICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgdGlsZUJbdDY0eF1bMjQwICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyNDAgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOyANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJUlNUIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICANCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007IA0KICAgICAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KDQogICAgICAgIC8vIE11bHQgc2NhbGVycw0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFQ09ORCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAxMjg7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIEtfSlVNUCAtIDMyLCBsZGIpOyAgICAgICAgDQogICAgICAgIA0KICAgICAgICAvLyBsZWZ0IG92ZXIgMzIgcm93cw0KICAgICAgICBhdXRvIGZyYWdfYl9sZWZ0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsgICAgICAgIA0KDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iX2xlZnQsIEFfcHRyICsgKGtiYXNlICsgS19KVU1QIC0gMzIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOw0KDQogICAgICAgIHRpbGVBcyA9IEFzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICB0aWxlQnMgPSBCc19wdHJbKChrYmFzZSArIDEyOCkgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgLy8gVE9ETzogcHJhZ21hIHVucm9sbCA0IGxlYWRzIHRvIHJlZ2lzdGVyIHNwaWxsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldICs9IHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0gKiB0aWxlQnM7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYodGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSwgdGlsZUJzLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYoc2NhbGUsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgfSANCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCg0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoTSA9PSA5NiB8fCBNID09IDY0KXsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMTYgLSAxKSAvIChudW1fd2FycF94ICogMTYpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMTYgLSAxKSAvIChudW1fd2FycF95ICogMTYpKTsNCiAgICAgICAga19sYXJnZV9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsgICAgDQogICAgfQ0KDQogICAgaWYgKEsgIT0gNzE2OCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoTSA9PSA2MTQ0ICYmIChOID09IDQ2MDggfHwgTiA9PSAxNTM2KSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IDU4OTgyNCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+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 24311.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgICAgICBmbG9hdDIgdmFsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDIqPihBc19wdHIgKyBibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIE0gKiAoa2Jhc2UgLyAxMjgpKVt0NjR4XTsNCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IG1ha2VfZmxvYXQyKHZhbC54ICogdGlsZUJzLCB2YWwueSAqIHRpbGVCcyk7DQogICAgICAgIH0gICAgICAgDQoNCiAgICAgICAgLy8gaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAvLyAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgIC8vICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Mio+KHRpbGVBcylbdDY0eF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdICogdGlsZUJzOw0KICAgICAgICAvLyB9DQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsgDQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIDY0ICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyA2NF07DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaV9sb2FkIDwgS19KVU1QDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICAgLy8gQXBwbHkgc2NhbGVyDQoNCg0KICAgICAgICAvLyBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgaW50IHBsYWNlID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIDQgKiAodDY0eCAvIDMyKTs7DQoNCiAgICAgICAgLy8gaSA9IDANCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMF0gICs9IHRpbGVBc1twbGFjZSArIDBdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzFdICArPSB0aWxlQXNbcGxhY2UgKyAxXSAgKiBmcmFnX2FjY19ibG9jay54WzFdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsyXSAgKz0gdGlsZUFzW3BsYWNlICsgMl0gICogZnJhZ19hY2NfYmxvY2sueFsyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbM10gICs9IHRpbGVBc1twbGFjZSArIDNdICAqIGZyYWdfYWNjX2Jsb2NrLnhbM107DQoNCiAgICAgICAgLy8gaSA9IDENCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNF0gICs9IHRpbGVBc1twbGFjZSArIDhdICAqIGZyYWdfYWNjX2Jsb2NrLnhbNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzVdICArPSB0aWxlQXNbcGxhY2UgKyA5XSAgKiBmcmFnX2FjY19ibG9jay54WzVdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs2XSAgKz0gdGlsZUFzW3BsYWNlICsgMTBdICogZnJhZ19hY2NfYmxvY2sueFs2XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbN10gICs9IHRpbGVBc1twbGFjZSArIDExXSAqIGZyYWdfYWNjX2Jsb2NrLnhbN107DQoNCiAgICAgICAgLy8gaSA9IDINCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOF0gICs9IHRpbGVBc1twbGFjZSArIDE2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzldICArPSB0aWxlQXNbcGxhY2UgKyAxN10gKiBmcmFnX2FjY19ibG9jay54WzldOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMF0gKz0gdGlsZUFzW3BsYWNlICsgMThdICogZnJhZ19hY2NfYmxvY2sueFsxMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzExXSArPSB0aWxlQXNbcGxhY2UgKyAxOV0gKiBmcmFnX2FjY19ibG9jay54WzExXTsNCg0KICAgICAgICAvLyBpID0gMw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMl0gKz0gdGlsZUFzW3BsYWNlICsgMjRdICogZnJhZ19hY2NfYmxvY2sueFsxMl07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEzXSArPSB0aWxlQXNbcGxhY2UgKyAyNV0gKiBmcmFnX2FjY19ibG9jay54WzEzXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTRdICs9IHRpbGVBc1twbGFjZSArIDI2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTRdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNV0gKz0gdGlsZUFzW3BsYWNlICsgMjddICogZnJhZ19hY2NfYmxvY2sueFsxNV07DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOyAvLyBXZSBuZWVkIHRoaXMgc3ludGhyZWFkcygpDQogICAgfSAvLyBlbmQgZm9yIGtiYXNlDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTSkgcmV0dXJuOw0KDQogICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICAgYXV0byBmcmFnX3Jlc3VsdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9QTEFDRUhPTERFUiwgcm9jd21tYTo6YmZsb2F0MTZfdD4oKTsgLy9QbGFjZWhvbGRlciBmcmFnDQogICAgDQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICAgfQ0KICAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQogICAgLy8gaW50IHNuID0gTiAvIDEyODsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQls2NF1bMjY0XTsgLy8gcm93LW1hag0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs2NF1bMjMyXTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBpbnQgbGRiID0gMjY0Ow0KICAgIGludCBsZGEgPSAyMzI7DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQogDQogICAgICAgIC8vIExvYWQgdGlsZXMNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGlsZUJbdDY0eF1bMjI0ICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyMjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4XVsyNDAgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDI0MCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07IA0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsga21pbmksIGxkYik7ICAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsgDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgIGZsb2F0IHRpbGVBcyA9IEFzX3B0clsoa2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBmbG9hdCBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDEyODsga21pbmkgPCBLX0pVTVAgLSAzMjsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9ICANCg0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsgS19KVU1QIC0gMzIsIGxkYik7ICAgICAgICANCiAgICAgICAgDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyBLX0pVTVAgLSAzMikgKiBNICsgY29sX2Jhc2VfQywgTSk7DQogICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYl9sZWZ0LCBmcmFnX2FjY19ibG9jayk7DQoNCiAgICAgICAgdGlsZUFzID0gQXNfcHRyWygoa2Jhc2UgKyAxMjgpIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIHRpbGVCcyA9IEJzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAvLyBUT0RPOiBwcmFnbWEgdW5yb2xsIDQgbGVhZHMgdG8gcmVnaXN0ZXIgc3BpbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9IA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICB9Ly8gZW5kIGZvciAoaW50IGtiYXNlID0gMDsga2Jhc2UgPCBLOyBrYmFzZSArPSAxMjgpIA0KDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE0pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KfQ0KDQpjb25zdGV4cHIgaW50IEtfVkFMVUUgPSA3MTY4Ow0KY29uc3RleHByIGludCBNX1ZBTFVFID0gNjE0NDsNCmNvbnN0ZXhwciBpbnQgTl9WQUxVRSA9IDQ2MDg7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgTiA9PSBOX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICANCiAgICBpZiAoTSAqIE4gPD0gVEhSRVNIT0xEKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeCAqIDE2KSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeSAqIDE2KSk7DQogICAgICAgIGtfbGFyZ2Vfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQoNCiAgICBlbHNlIHsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMzIgLSAxKSAvIChudW1fd2FycF94ICogMzIpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMzIgLSAxKSAvIChudW1fd2FycF95ICogMzIpKTsNCiAgICAgICAgYmFsYW5jZV9uZXdfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICByZXR1cm47ICAgIA0KICAgIH0NCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQppbXBvcnQgdG9yY2gNCmJsb2NrX3NoYXBlID0gMTI4DQoNCg0KIyBiaWcgb25lLCB1c2VkIHdoZW4gTiBpcyA+PSAzMDcyDQptb2R1bGVfYmlnID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMjAiXSwgICAgDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgbW9kdWxlX2JpZy5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykgDQogICAgcmV0dXJuIGMNCg==No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIGZsb2F0MiB2YWwgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdOw0KICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdDIqPih0aWxlQXMpW3Q2NHhdID0gbWFrZV9mbG9hdDIodmFsLnggKiB0aWxlQnMsIHZhbC55ICogdGlsZUJzKTsNCiAgICAgICAgfSAgICAgICANCg0KICAgICAgICAvLyBpZiAodDY0eSA9PSAwKSB7DQogICAgICAgIC8vICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKCgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgLy8gICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQyKj4oQXNfcHRyICsgYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyBNICogKGtiYXNlIC8gMTI4KSlbdDY0eF0gKiB0aWxlQnM7DQogICAgICAgIC8vIH0NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIC8vaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgLy9pbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIC8vaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIC8vaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAvL2ludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgLy9pZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOyAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBOICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9yb3dfbWFqb3IpOw0KfQ0KDQojZGVmaW5lIEtfSlVNUCAyNTYNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBrX2xhcmdlX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBQZXJmb3JtIEIgQCBBLlQgPSBDLlQsIHNvIHdlIGNhbiBzdG9yZSBzY2FsZSBBcyBpbiBhIFZHUFIgb2YgZWFjaCB0aHJlYWQgaW4gYSB3YXJwDQogICAgQjogTnhLIGNvbC1tYWogLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IE4vMTI4IHggSy8xMjggY29sLW1hag0KICAgIEEuVDogS3hNIHJvdy1tYWogLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBLLyAxMjggeCBNIHJvdy1tYWoNCiAgICBDLlQ6IE54TSBjb2wtbWFqDQogICAgTSwgTiBhcmUgZGl2aXNpYmxlIGJ5IDY0LCBLIGlzIGRpdmlzaWJsZSBieSAyNTYNCg0KICAgIFNNRU0gd2l0aCBwYWRkaW5nIHBlciBibG9jazoNCiAgICA2NCAqICgyNTYgKyA4KSAvIDEwMjQgKyA2NCAqICgyMjQgKyA4KSAvIDEwMjQgPSAxNi41ICsgMTQuNSA9IDMxIEtCIHBlciBibG9jaw0KDQogICAgKi8NCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgIC8vIGludCBzbiA9IE4gLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbNjRdWzI2NF07IC8vIHJvdy1tYWoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzIzMl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgaW50IGxkYiA9IDI2NDsNCiAgICBpbnQgbGRhID0gMjMyOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyBMb2FkIHRpbGVzDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDMyOyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHRpbGVCW3Q2NHhdWzIyNCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMjI0ICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgdGlsZUJbdDY0eF1bMjQwICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyNDAgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOyANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJUlNUIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICANCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007IA0KICAgICAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KDQogICAgICAgIC8vIE11bHQgc2NhbGVycw0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFQ09ORCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAxMjg7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIEtfSlVNUCAtIDMyLCBsZGIpOyAgICAgICAgDQogICAgICAgIA0KICAgICAgICAvLyBsZWZ0IG92ZXIgMzIgcm93cw0KICAgICAgICBhdXRvIGZyYWdfYl9sZWZ0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsgICAgICAgIA0KDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iX2xlZnQsIEFfcHRyICsgKGtiYXNlICsgS19KVU1QIC0gMzIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOw0KDQogICAgICAgIHRpbGVBcyA9IEFzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICB0aWxlQnMgPSBCc19wdHJbKChrYmFzZSArIDEyOCkgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgLy8gVE9ETzogcHJhZ21hIHVucm9sbCA0IGxlYWRzIHRvIHJlZ2lzdGVyIHNwaWxsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldICs9IHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0gKiB0aWxlQnM7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYodGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSwgdGlsZUJzLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYoc2NhbGUsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgfSANCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCg0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoTSA9PSA5NiB8fCBNID09IDY0KXsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMTYgLSAxKSAvIChudW1fd2FycF94ICogMTYpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMTYgLSAxKSAvIChudW1fd2FycF95ICogMTYpKTsNCiAgICAgICAga19sYXJnZV9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsgICAgDQogICAgfQ0KDQogICAgaWYgKEsgIT0gNzE2OCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoTSA9PSA2MTQ0ICYmIChOID09IDQ2MDggfHwgTiA9PSAxNTM2KSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IDU4OTgyNCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=No newline at end of file
Best evidence level for this revision: reported
JSON