I2lmbmRlZiBDT05GSUdfTUlOXzhNX1ZFUlNJT04NCiNpbmNsdWRlICJhdF9jb250ZXh0LmgiDQoNCmludCBleHRfTG9ja2xpc3RBdXRoX2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tMSVNUQVVUSF9SRVEsc3RybGVuKGF0X3BhcmFzKSwgKHVuc2lnbmVkIGNoYXIgKilhdF9wYXJhcywwKSkNCgkJcmV0dXJuIEFUX0NPTlRJTlVFOw0KCWVsc2V7DQoJCSpyZXNfbXNnID0gYXRfZXJyX2J1aWxkKEFURVJSX1BST0NfRkFJTEVEKTsNCgkJcmV0dXJuIEFUX0VORDsNCgl9DQp9DQoNCmludCBleHRfTG9ja25ldExpc3Rfc2V0X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRMSVNUX1NFVF9SRVEsc3RybGVuKGF0X3BhcmFzKSwgKHVuc2lnbmVkIGNoYXIgKilhdF9wYXJhcywwKSkNCglyZXR1cm4gQVRfQ09OVElOVUU7DQoJZWxzZXsNCgkJKnJlc19tc2cgPSBhdF9lcnJfYnVpbGQoQVRFUlJfUFJPQ19GQUlMRUQpOw0KCQlyZXR1cm4gQVRfRU5EOw0KCX0NCn0NCg0KaW50IGV4dF9Mb2NrbmV0S2V5X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRLRVlfUkVRLHN0cmxlbihhdF9wYXJhcyksICh1bnNpZ25lZCBjaGFyICopYXRfcGFyYXMsMCkpDQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KCWVsc2V7DQoJCSpyZXNfbXNnID0gYXRfZXJyX2J1aWxkKEFURVJSX1BST0NfRkFJTEVEKTsNCgkJcmV0dXJuIEFUX0VORDsNCgl9DQp9DQoNCmludCBleHRfTG9ja25ldEFtdFN0YXR1c19nZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQ0Kew0KCWlmKDAgPT0gaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVEFNVFNUQVRVU19HRVRfUkVRLCAwLCBOVUxMLDApKQ0KCXJldHVybiBBVF9DT05USU5VRTsNCgllbHNlew0KCQkqcmVzX21zZyA9IGF0X2Vycl9idWlsZChBVEVSUl9QUk9DX0ZBSUxFRCk7DQoJCXJldHVybiBBVF9FTkQ7DQoJfQ0KfQ0KDQppbnQgZXh0X0xvY2tuZXREaWdlc3RfZ2V0X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRESUdFU1RfR0VUX1JFUSwgMCwgTlVMTCwwKSkNCglyZXR1cm4gQVRfQ09OVElOVUU7DQoJZWxzZXsNCgkJKnJlc19tc2cgPSBhdF9lcnJfYnVpbGQoQVRFUlJfUFJPQ19GQUlMRUQpOw0KCQlyZXR1cm4gQVRfRU5EOw0KCX0NCn0NCg0KaW50IGV4dF9Mb2NrbmV0U2lnbl9zZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQ0Kew0KCWlmKDAgPT0gaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVFNJR05fU0VUX1JFUSxzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLDApKQ0KCXJldHVybiBBVF9DT05USU5VRTsNCgllbHNlew0KCQkqcmVzX21zZyA9IGF0X2Vycl9idWlsZChBVEVSUl9QUk9DX0ZBSUxFRCk7DQoJCXJldHVybiBBVF9FTkQ7DQoJfQ0KfQ0KDQppbnQgZXh0X0xvY2tuZXRMZXZlbF9nZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQ0Kew0KCWlmKDAgPT0gaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVExFVkVMX0dFVF9SRVEsIDAsIE5VTEwsMCkpDQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KCWVsc2V7DQoJCSpyZXNfbXNnID0gYXRfZXJyX2J1aWxkKEFURVJSX1BST0NfRkFJTEVEKTsNCgkJcmV0dXJuIEFUX0VORDsNCgl9DQp9DQoNCmludCBleHRfTG9ja25ldExpc3RfZ2V0X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRMSVNUX0dFVF9SRVEsc3RybGVuKGF0X3BhcmFzKSwgKHVuc2lnbmVkIGNoYXIgKilhdF9wYXJhcywwKSkNCglyZXR1cm4gQVRfQ09OVElOVUU7DQoJZWxzZXsNCgkJKnJlc19tc2cgPSBhdF9lcnJfYnVpbGQoQVRFUlJfUFJPQ19GQUlMRUQpOw0KCQlyZXR1cm4gQVRfRU5EOw0KCX0NCn0NCg0KaW50IGV4dF9Mb2NrbmV0QXV0aF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaWYoMCA9PSBpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUQVVUSF9SRVEsIDAsIE5VTEwsMCkpDQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KCWVsc2V7DQoJCSpyZXNfbXNnID0gYXRfZXJyX2J1aWxkKEFURVJSX1BST0NfRkFJTEVEKTsNCgkJcmV0dXJuIEFUX0VORDsNCgl9DQp9DQoNCmludCBleHRfTG9ja25ldFVubG9ja1RpbWVzX2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaWYoMCA9PSBpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUVU5MT0NLVElNRVNfR0VUX1JFUSwgMCwgTlVMTCwwKSkNCglyZXR1cm4gQVRfQ09OVElOVUU7DQoJZWxzZXsNCgkJKnJlc19tc2cgPSBhdF9lcnJfYnVpbGQoQVRFUlJfUFJPQ19GQUlMRUQpOw0KCQlyZXR1cm4gQVRfRU5EOw0KCX0NCn0NCg0KaW50IGV4dF9Mb2NrbmV0U3RhdHVzX2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaWYoMCA9PSBpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUU1RBVFVTX0dFVF9SRVEsIDAsIE5VTEwsMCkpDQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KCWVsc2V7DQoJCSpyZXNfbXNnID0gYXRfZXJyX2J1aWxkKEFURVJSX1BST0NfRkFJTEVEKTsNCgkJcmV0dXJuIEFUX0VORDsNCgl9DQp9DQoNCmludCBleHRfTG9ja25ldFVubG9ja19mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaWYoMCA9PSBpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUVU5MT0NLX1JFUSxzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLDApKQ0KCXJldHVybiBBVF9DT05USU5VRTsNCgllbHNlew0KCQkqcmVzX21zZyA9IGF0X2Vycl9idWlsZChBVEVSUl9QUk9DX0ZBSUxFRCk7DQoJCXJldHVybiBBVF9FTkQ7DQoJfQ0KfQ0KDQovL8rVtb16dWRyedb3tq/Jz7Gow/zB7rrzo6zPwreiQVQrWlNDSFBMTU49Mcq5bW9kZW3UytDty9HN+Ci4w8P8we7Kx9Tay/jN+LmmxNzW0Mq508MpDQppbnQgenVyZHlfYXV0b19hY3QoY2hhciAqYXRfcGFyYXMgLGludCBpc19xdWVyeV9yZXBvcnQpDQp7DQogICAgaW50IGFwcG1vZGUgPSAwOw0KICAgIGludCBpbml0cmVzdWx0ID0gMDsNCiAgICB2b2lkICpwWzJdID0geyZhcHBtb2RlLCAmaW5pdHJlc3VsdH07DQogICAgDQogICAgcGFyc2VfcGFyYW0yKCIlZCwlZCIsIGF0X3BhcmFzLCBwKTsNCiAgICBhdF9wcmludChBVF9FUlIsInp1cmR5X2F1dG9fYWN0IGFwcG1vZGU6JWQsaW5pdHJlc3VsdDolZCFcbiIsYXBwbW9kZSxpbml0cmVzdWx0KTsNCiAgICBpZihhcHBtb2RlICE9IDAgJiYgKGluaXRyZXN1bHQgPT0gMzAgfHwgaW5pdHJlc3VsdCA9PSAzMSkpDQogICAgeyAgIAkJDQoJCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCwgTU9EVUxFX0lEX0xPQ0tORVQsIE1TR19DTURfWlVSRFlfTE9DS0FVVEhfUkVRLCAwLCBOVUxMLDApOw0KCX0NCiAgICByZXR1cm4gQVRfRU5EOw0KfQ0KDQp2b2lkIGV4dF9sb2NrbmV0X3JlZ2lzdF9pbml0KCkNCnsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkxPQ0tMSVNUQVVUSD0iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tsaXN0QXV0aF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkxPQ0tORVRMSVNUPSIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja25ldExpc3Rfc2V0X2Z1bmMpOwkNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIlVOTE9DS0tFWT0iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXRLZXlfZnVuYyk7DQoJcmVnaXN0ZXJfc2Vydl9mdW5jKCJVTkxPQ0tLRVk/IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0QW10U3RhdHVzX2dldF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkxPQ0tESUdFU1Q/IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0RGlnZXN0X2dldF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkxPQ0tTSUdOPSIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja25ldFNpZ25fc2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTE9DS0xFVkVMPyIsIE1PRFVMRV9JRF9MT0NLTkVULGV4dF9Mb2NrbmV0TGV2ZWxfZ2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTUVQQ0c9IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0TGlzdF9nZXRfZnVuYyk7DQoJcmVnaXN0ZXJfc2Vydl9mdW5jKCJMT0NLTkVUQVVUSCIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja25ldEF1dGhfZnVuYyk7DQoJcmVnaXN0ZXJfc2Vydl9mdW5jKCJaTkNLPyIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja25ldFVubG9ja1RpbWVzX2dldF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIlpTRUM/IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0U3RhdHVzX2dldF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIlpOQ0s9IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0VW5sb2NrX2Z1bmMpOw0KDQoJcmVnaXN0ZXJfaW5mb3JtX2Z1bmMoIlpVUkRZIix6dXJkeV9hdXRvX2FjdCk7DQp9DQojZW5kaWYNCg0K